#include"Stack.h"
//初始化栈（接受main函数创建的ST类型的结构体）
void STInit(ST* ps)
{
	//虽然ST结构体未初始化，但其的指针也不可能为空
	assert(ps);

	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
//入栈函数
void STPush(ST* ps, STDataType x)
{
	assert(ps);

	if (ps->capacity == ps->top)
	{
		//通过capacity是否为0，来确定新容量的大小
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//用一个中间变量来接受新的空间，有效保护旧空间的大小
		ST* tmp = realloc(ps->a, sizeof(ST) * (newcapacity));
		if (tmp == NULL)
		{
			printf("realloc failed");
			exit(-1);
		}
		//再把中间变量赋给a
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//执行入栈
	ps->a[ps->top] = x;
	ps->top++;
}
//出栈函数
void STPop(ST* ps)
{
	assert(ps);
	//出栈得保证有栈元素
	assert(ps->top != 0);
	ps->top--;
}
//返回栈顶元素
int STTop(ST* ps)
{
	assert(ps);
	assert(ps->top != 0);

	return ps->a[ps->top];
}
//获取栈元素个数
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}
//检测栈是否为空
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

//摧毁栈
bool STDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}